package com.Algorithm.HUAWEI.two20220303;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: zjz
 * @Date: 2022/03/03/11:09
 * @Description:
 * @Target:
 */
public class 识别有效的IP地址和掩码并进行分类统计 {

    /*
    *
    * 请解析IP地址和对应的掩码，进行分类识别。要求按照A/B/C/D/E类地址归类，不合法的地址和掩码单独归类。

        所有的IP地址划分为 A,B,C,D,E五类

        A类地址从1.0.0.0到126.255.255.255;

        B类地址从128.0.0.0到191.255.255.255;

        C类地址从192.0.0.0到223.255.255.255;

        D类地址从224.0.0.0到239.255.255.255；

        E类地址从240.0.0.0到255.255.255.255





        子网掩码为二进制下前面是连续的1，然后全是0。（例如：255.255.255.32就是一个非法的掩码）
        （注意二进制下全是1或者全是0均为非法子网掩码）

        注意：
        1. 类似于【0.*.*.*】和【127.*.*.*】的IP地址不属于上述输入的任意一类，也不属于不合法ip地址，计数时请忽略
        2. 私有IP地址和A,B,C,D,E类地址是不冲突的
        *
        *10.70.44.68~255.254.255.0
        1.0.0.1~255.0.0.0
        192.168.0.2~255.255.255.0
        19..0.~255.255.255.0

        *   10.70.44.68~255.254.255.0的子网掩码非法，19..0.~255.255.255.0的IP地址非法，所以错误IP地址或错误掩码的计数为2；
        1.0.0.1~255.0.0.0是无误的A类地址；
        192.168.0.2~255.255.255.0是无误的C类地址且是私有IP；
        所以最终的结果为1 0 1 0 0 2 1

    *
    *
    *
    *
    * */
    public static void main(String[] args) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        Scanner in = new Scanner(System.in);
        int[] ints = new int[7];   // 记录A,B,C,D,E,错误IP，私有Ip
                                   //   0 1 2 3 4   5      6
        while (in.hasNext()){
            String ss = in.nextLine();
            String[] split = ss.split("~");
            if (split[0].length()>4&&(split[0].split("\\.")[0].equals("0")||split[0].split("\\.")[0].equals("127"))){

            }else {
                if (!correctYanMa(split[1])){
                    ints[5]++;
                }else {
                    handleIP(split[0],ints);
                }
            }
        }
        for (int anInt : ints) {
            System.out.print(anInt+" ");
        }
        System.out.println();


    }


    static void handleIP(String ss,int[] ints){
        String[] split = ss.split("\\.");
        if (split.length!=4){
            ints[5]++;
        }else {
            if (!check0255(split[0])||!check0255(split[1])||!check0255(split[2])||!check0255(split[3])){
                ints[5]++;
            }else {
                if (numCompare(split[0],1,126)){
                    ints[0]++;
                }else if (numCompare(split[0],128,191)){
                    ints[1]++;
                }else if (numCompare(split[0],192,223)){
                    ints[2]++;
                }else if (numCompare(split[0],224,239)){
                    ints[3]++;
                }else if (numCompare(split[0],240,255)){
                    ints[4]++;
                }

                //       私网IP范围是：
                //
                //        从10.0.0.0到10.255.255.255
                //
                //        从172.16.0.0到172.31.255.255
                //
                //        从192.168.0.0到192.168.255.255
                if (numCompare(split[0],10,10)||(numCompare(split[0],172,172)&&(numCompare(split[1],16,31)))||(numCompare(split[0],192,192)&&numCompare(split[1],168,168))){
                    ints[6]++;
                }
            }
        }

    }


    static boolean numCompare(String ss,int a,int b){
        if (Integer.valueOf(ss)>=a&&Integer.valueOf(ss)<=b){
            return true;
        }else {
            return false;
        }
    }


    // check服务，【0,255】 true是符合，false是不符合
    static boolean check0255(String ss){
        if ("".equals(ss)||ss==null||Integer.valueOf(ss)<0||Integer.valueOf(ss)>255){
            return false;
        }else {
            return true;
        }
    }

    // 跑长度，跑到0就停，然后判断0后面的都是0--直接用一个标志，然后----
    // 10分割，01分割
    // 包含01,10

    // false就表示不是，true就表示是了
    static boolean correctYanMa(String ss){
        boolean flag = true;
        String[] split = ss.split("\\.");
        StringBuffer stringBuffer = new StringBuffer();
        for (String s : split) {
            stringBuffer.append(DecToBin(s));
        }

        if (stringBuffer.toString().contains("01")||!stringBuffer.toString().contains("1")||!stringBuffer.toString().contains("0")){
            flag = false;
        }


        return flag;
    }

    static String DecToBin(String ss){
        Integer integer = Integer.valueOf(ss);
        StringBuffer stringBuffer = new StringBuffer();
        while (integer>0){
            stringBuffer.append(integer%2);
            integer/=2;
        }

        while (stringBuffer.length()<8){
            stringBuffer.append("0");
        }

        return stringBuffer.reverse().toString();
    }


}
